﻿using System.Collections;
using UnityEngine;

/// <summary>
/// 法力值管理系统（单例模式）：负责管理游戏中的法力值总量、消耗、恢复逻辑，并同步更新UI显示
/// 继承自Singleton<ManaSystem>，确保全局唯一实例，方便其他模块访问
/// </summary>
public class ManaSystem : Singleton<ManaSystem>
{
    [SerializeField]
    private ManaUI manaUI;  // 法力值UI组件引用（通过Inspector面板绑定，用于同步显示当前法力值）

    private const int MAX_MANA = 3;  // 法力值上限（常量，不可修改）
    private int currentMana = MAX_MANA;  // 当前可用法力值（初始为满值）

    /// <summary>
    /// 当对象启用时触发（如场景加载或对象被激活）
    /// 注册法力相关动作的执行器，并订阅敌人回合结束的反应事件
    /// </summary>
    private void OnEnable()
    {
        // 向动作系统注册"消耗法力"动作（SpendManaGA）的执行器为SpendManaPerformer方法
        // 当游戏中触发SpendManaGA类型的动作时，会调用SpendManaPerformer处理消耗逻辑
        ActionSystem.AttachPerformer<SpendManaGA>(SpendManaPerformer);

        // 向动作系统注册"恢复法力"动作（RefillManaGA）的执行器为RefillManaPerformer方法
        // 当游戏中触发RefillManaGA类型的动作时，会调用RefillManaPerformer处理恢复逻辑
        ActionSystem.AttachPerformer<RefillManaGA>(RefillManaPerformer);

        // 向动作系统订阅"敌人回合结束"动作（EnemyTurnGA）的后置反应（ReactionTiming.POST）
        // 当敌人回合完全结束后，会触发EnemyTurnPostReaction方法（用于自动恢复法力）
        ActionSystem.SubScribeReaction<EnemyTurnGA>(EnemyTurnPostReaction, ReactionTiming.POST);
    }

    /// <summary>
    /// 当对象禁用时触发（如场景卸载或对象被销毁）
    /// 取消注册法力相关动作的执行器，并取消订阅敌人回合结束的反应事件
    /// </summary>
    private void OnDisable()
    {
        // 注销"消耗法力"动作（SpendManaGA）的执行器绑定
        ActionSystem.DetachPerformer<SpendManaGA>();

        // 注销"恢复法力"动作（RefillManaGA）的执行器绑定
        ActionSystem.DetachPerformer<RefillManaGA>();

        // 取消订阅"敌人回合结束"动作（EnemyTurnGA）的后置反应事件
        ActionSystem.UnsubScribeReaction<EnemyTurnGA>(EnemyTurnPostReaction, ReactionTiming.POST);
    }

    /// <summary>
    /// 检查当前法力值是否足够使用指定数量的法力
    /// </summary>
    /// <param name="amount">需要消耗的法力值数量</param>
    /// <returns>当前法力值足够时返回true，否则返回false</returns>
    public bool HasEnoughMana(int amount)
    {
        return currentMana >= amount;
    }

    /// <summary>
    /// 消耗法力的动作执行器（协程）：处理法力值减少逻辑并更新UI
    /// </summary>
    /// <param name="spendManaGA">触发消耗的"消耗法力"动作对象（包含本次需要消耗的法力值）</param>
    /// <returns>协程迭代器（此处无延迟，直接执行）</returns>
    private IEnumerator SpendManaPerformer(SpendManaGA spendManaGA)
    {
        currentMana -= spendManaGA.Amount;  // 扣除指定数量的法力值
        manaUI.UpdateManaText(currentMana);  // 更新UI显示当前法力值
        yield return null;  // 协程等待一帧（此处无额外延迟需求）
    }

    /// <summary>
    /// 恢复法力的动作执行器（协程）：将法力值重置为最大值并更新UI
    /// </summary>
    /// <param name="refillManaGA">触发恢复的"恢复法力"动作对象（当前逻辑未使用其属性）</param>
    /// <returns>协程迭代器（此处无延迟，直接执行）</returns>
    private IEnumerator RefillManaPerformer(RefillManaGA refillManaGA)
    {
        currentMana = MAX_MANA;  // 重置法力值为上限值
        manaUI.UpdateManaText(currentMana);  // 更新UI显示当前法力值
        yield return null;  // 协程等待一帧（此处无额外延迟需求）
    }

    /// <summary>
    /// 敌人回合结束后的反应方法（由动作系统在敌人回合POST阶段触发）
    /// 自动触发法力恢复动作（RefillManaGA），使法力值重置为最大值
    /// </summary>
    /// <param name="enemyTurnGA">触发的"敌人回合结束"动作对象（当前逻辑未使用其属性）</param>
    private void EnemyTurnPostReaction(EnemyTurnGA enemyTurnGA)
    {
        RefillManaGA refillManaGA = new RefillManaGA();  // 创建恢复法力动作对象
        ActionSystem.instance.AddReaction(refillManaGA);  // 将恢复动作添加到动作系统队列，触发执行
    }
}